#include "personnage.h"

struct personnage
{
	int x;
	int y;
	int speed;
	int dim;
	int hp;
	int hpmax;
	direction d;
	inventaire inv;
	sprite skin;
};

// Fonctions get directes pour le personnage
sprite PgetSkin(personnage perso) { return perso->skin; }
int PgetX(personnage perso) { return perso->x; }
int PgetY(personnage perso) { return perso->y; }
int PgetSpeed(personnage perso) { return perso->speed; }
int PgetDim(personnage perso) { return perso->dim; }
inventaire PgetInv(personnage perso) { return perso->inv; }
int PgetHP(personnage perso) { return perso->hp; }
int PgetHPMax(personnage perso) { return perso->hpmax; }
direction PgetDir(personnage perso) { return perso->d; }

// Fonctions get indirectes pour le personnage
arme PgetFstWpn(personnage perso) { return IgetFstWpn(perso->inv); }
arme PgetSndWpn(personnage perso) { return IgetSndWpn(perso->inv); }
sort PgetFstSpl(personnage perso) { return IgetFstSpl(perso->inv); }
sort PgetSndSpl(personnage perso) { return IgetSndSpl(perso->inv); }

// Fonctions set directes pour le personnage
void PmoveTo(personnage perso, int x, int y)
{
	perso->x = x;
	perso->y = y;
}
void PsetSpeed(personnage perso, int spd) { perso->speed = spd; }
void PsetHP(personnage perso, int hp) { perso->hp = hp; }
void PsetHPMax(personnage perso, int hpmax) { perso->hpmax = hpmax; }
void PsetDir(personnage perso, vers dir) { DIRsetDir(perso->d, dir); }

personnage Pnew(sprite_type type)
{
	personnage perso = malloc(sizeof(struct personnage));
	perso->skin = SPRnew(type);
	perso->inv = Inew();
	perso->d = DIRnew();
	perso->x = 0;
	perso->y = 0;
	DIRsetX(perso->d, 0);
	DIRsetY(perso->d, 0);
	PsetDimAccToSpr(perso);
	return perso;
}

void Pfree(personnage perso)
{
	if( perso != NULL )
	{
		Ifree(perso->inv);
		SPRfree(perso->skin);
		DIRfree(perso->d);
		free(perso);
	}
}

void Pdisplay(personnage perso)
{
  SPRblit(perso->skin, perso->x, perso->y);
}

void Pmove(personnage perso, screen e)
{
  Pdisplay(perso);
  perso->x = BORNER(perso->x + DIRgetX(perso->d) * perso->speed, SCRgetXMin(e), SCRgetXMax(e) - perso->dim);
  perso->y = BORNER(perso->y + DIRgetY(perso->d) * perso->speed, SCRgetYMin(e), SCRgetYMax(e) - perso->dim);
  Pdisplay(perso);
}

void Plancer(personnage perso, projectiles projs, projectile proj)
{
	DIRsetDir(PROgetDir(proj), DIRgetV(PgetDir(perso)));
	PROJSpush(projs, proj);
}

void affiche_inventaire(personnage perso)
{
	//printf("Wpn1 : %s\n",perso->inv->wpn1->nom);
	// TODO RM>faire un affichage utilisant les ecrans virtuels pour garder le contenu de la fenetre de jeu
}

void PchangeSprType(personnage perso, sprite_type type)
{
	SPRsetType(perso->skin, type);
  PsetDimAccToSpr(perso);
}

void PsetDimAccToSpr(personnage perso)
{
	switch( SPRgetType(perso->skin) )
  {
    case SPRITE8:
      perso->dim = 8;
      break;
    case SPRITE16:
      perso->dim = 16;
      break;
    case SPRITE32:
      perso->dim = 32;
      break;
  }
}
